home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / tools / zmc3v078 / zmc3v078.lzh / SRCSV078.LZH / READFILE.C < prev    next >
C/C++ Source or Header  |  1999-07-31  |  5KB  |  220 lines

  1. /* ======================================================
  2.      read file
  3.      input:  filename (you can omit extentions)
  4.              pointer to timestamp variable
  5.              supplement extentions(in/out)
  6.      output: pointer to readed file
  7.    ====================================================== */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include "switch.h"
  13.  
  14.  
  15. #include "config.h"
  16. UBYTE *readFile(BYTE *infilename,BYTE *outfilename,const char *inext[],const char *outext);
  17. UBYTE *readFile1(BYTE *infilename,int len,const char *inext[], int mode);
  18. UBYTE *readFile2(BYTE *filename);
  19.  
  20. #include "etc.h"
  21.  
  22.  
  23. #ifndef UNIXY_OS                    /* for setmode() */
  24.     #include <fcntl.h>
  25.     #include <io.h>
  26.     #ifdef X68000
  27.         #include <unistd.h>
  28.     #endif
  29. #endif
  30.  
  31.  
  32. #ifndef    SEEK_SET
  33.     #define    SEEK_SET    (0)
  34.     #define    SEEK_CUR    (1)
  35.     #define    SEEK_END    (2)
  36. #endif
  37.  
  38. /* ====================================================
  39.      read file
  40.      input:  filename (you can omit extentions)
  41.              pointer to timestamp variable
  42.              supplement extentions(in/out)
  43.      output: pointer to readed file
  44.      effect: set source/destination files
  45.    ==================================================== */
  46.  
  47. UBYTE *readFile(BYTE *infilename,BYTE *outfilename,const char *inext[],const char *outext)
  48. {
  49.     UBYTE *zbuf;
  50.     BYTE *filename_ext;
  51.     int i,flg = 1,len;
  52.  
  53.     if (infilename[0] == '-' && getSwitchVal('c') == RES_VAL && !outfilename[0]) {
  54.         fatal(ILLEGALSWITCH,"Error: destination file is not specified.\n");
  55.     }
  56.  
  57.     len = (strlen(infilename) > strlen(outfilename))? strlen(infilename) : strlen(outfilename);
  58.     filename_ext = (char*)emalloc(sizeof(char) * (len + 16), "filename_ext");
  59.     strcpy(filename_ext,infilename);            /* read source filename */
  60.  
  61.     zbuf = readFile1(filename_ext, len, inext, 1);
  62.  
  63.                                                 /* set destination filename */
  64.     if (outfilename[0]) {
  65.         strcpy(filename_ext,outfilename);
  66.     }
  67.  
  68.  
  69. #ifdef _0
  70.     if (!isatty(1)) {                            /* if used stdout */
  71.         strcpy(filename_ext,"-");
  72.     } else {
  73. #endif
  74.         for (i = strlen(filename_ext); i > 0; i--) {
  75.             if (filename_ext[i] == '.') {
  76.                 flg = 0;
  77.                 break;
  78.             }
  79.         }
  80.         if (flg) {
  81.             i = strlen(filename_ext);
  82.         }
  83.         strcpy(&filename_ext[i],outext);
  84.         if (!outfilename[0]) {
  85.     #ifdef UNIXY_OS
  86.             BYTE pathdelimita = '/';
  87.     #else
  88.             BYTE pathdelimita = '\\';
  89.     #endif
  90.             int i,p = -1;
  91.  
  92.             for (i = 0; i < (int)strlen(filename_ext);) {
  93.                 if (filename_ext[i] == pathdelimita) {
  94.                     p = i;
  95.                 }
  96.     #ifdef UNIXY_OS
  97.                 i++;
  98.     #else                        /* when not UNIX, only SJIS is supported (in iskanji). */
  99.                 i += (iskanji(filename_ext[i]))? 2 : 1;
  100.     #endif
  101.             }
  102.             if (p >= 0) {                            /* cut directory name */
  103.                 memmove(filename_ext, &filename_ext[p + 1], strlen(filename_ext) - p + 1);
  104.             }
  105.         }
  106. #ifdef _0
  107.     }
  108. #endif
  109.     setOutFile(filename_ext);
  110.  
  111.     efree(filename_ext,"filename_ext");
  112.  
  113.     return zbuf;
  114. }
  115.  
  116.  
  117.  
  118.  
  119. /* readfile; w/o outfile supplements */
  120. UBYTE *readFile1(BYTE *filename_ext,int len, const char *inext[], int mode)
  121. {
  122.     UBYTE *zbuf;
  123.     char *infilename;
  124.  
  125.     infilename = (char*)emalloc(sizeof(char) * (len + 16), "infilename");
  126.     strcpy(infilename, filename_ext);            /* read source filename */
  127.  
  128. #ifdef _0
  129.     if (!isatty(0)) {                            /* if used stdin */
  130.         outfilename = infilename;
  131.         strcpy(filename_ext,"-");
  132.     }
  133. #endif
  134.     zbuf = readFile2(filename_ext);
  135.     if (!zbuf) {
  136.         while (*inext) {
  137.             strcpy(filename_ext, infilename);
  138.             strcat(filename_ext,*inext++);
  139.             zbuf = readFile2(filename_ext);
  140.             if (zbuf) {
  141.                 break;
  142.             }
  143.         }
  144.         if (!zbuf) {
  145.             fatal(FILENOTFOUND,"%s\tError: file not found.\n",infilename);
  146.             return (UBYTE*)NULL;
  147.         }
  148.     }
  149.  
  150.     if (mode) {
  151.         setInFile(filename_ext);
  152.     }
  153.  
  154.     efree(infilename,"infile");
  155.  
  156.     return zbuf;
  157. }
  158.  
  159.  
  160.  
  161.  
  162. /* =======================
  163.      read file (main)
  164.    ======================= */
  165.  
  166. UBYTE *readFile2(BYTE *filename)
  167. {
  168.     FILE *fp;
  169.     UBYTE *zbuf;
  170.     DWORD fl = 0,fl2;
  171.  
  172.  
  173.     if (!strcmp(filename,"-")) {                /* use standard input */
  174.         int c;
  175.         fl2 = 16 * 1024;
  176.  
  177. #ifndef UNIXY_OS                                /* set stdin to binary mode (MS-DOS only) */
  178.     #if defined (X68000) && defined (XCLIB)
  179.         fmode(stdin, _IOBINARY);                /* for X68000(XC) */
  180.     #elif defined (TOWNS)
  181.         _setmode(stdin, _BINARY);                /* for TOWNS(High-C) */
  182.     #else
  183.         setmode(fileno(stdin),O_BINARY);        /* for Win32/16, DOS, OS/2, X680x0(libc) */
  184.     #endif
  185. #endif    /* UNIXY_OS */
  186.  
  187.         zbuf = (UBYTE*)emalloc(sizeof(UBYTE) * fl2, "zbuf_in_readfile");
  188.         while ((c = fgetc(stdin)) != EOF) {
  189.             zbuf[fl++] = c;
  190.             if (fl >= fl2) {
  191.                 fl2 *= 2;
  192.                 zbuf = (UBYTE*)erealloc(zbuf, sizeof(UBYTE) * fl2, "zbuf_in_readfile");
  193.             }
  194.         }
  195.         fl--;    /* delete EOF */
  196.         zbuf = (UBYTE*)erealloc(zbuf, sizeof(UBYTE) * (fl2 + 4 + 2), "zbuf_in_readfile");
  197.     } else {
  198.         fp = fopen(filename,"rb");
  199.         if (fp==(FILE *)NULL) {
  200.             return (UBYTE*)NULL;
  201.         }
  202.         /*fl = filelength(fileno(fp));*/
  203.         fseek(fp,0,SEEK_END);
  204.         fl = ftell(fp);
  205.         rewind(fp);
  206.  
  207.         zbuf = (UBYTE*)emalloc(fl + 4 + 2, "zbuf_in_readfile_2");
  208.         fl2 = fread(zbuf,sizeof(UBYTE),fl,fp);
  209.         if (fl2 < fl) {
  210.             fatal(READERR,"%s\tError: read error.\n",filename);
  211.         }
  212.         fclose(fp);
  213.     }
  214.  
  215.     zbuf[fl] = 0x0d;
  216.     zbuf[fl+1] = 0x0a;
  217.     zbuf[fl+2] = zbuf[fl+3] = zbuf[fl + 4] = zbuf[fl + 5] = 0xFF;    /* gurdian */
  218.     return zbuf;
  219. }
  220.